home *** CD-ROM | disk | FTP | other *** search
- Czo³em,
-
-
- Nie by³o mnie przez dwa dni, a kiedy wróci³em moja skrzynka pocztowa by³a
- zawalona spekulacjami na temat testowej procedury Darka ¦mietany. Poniewa¿
- wyra¿ane opinie by³y dosyæ skrajne i g³ównie koncentrowa³y siê na
- przyalignowaniu (b±d¼ nie) struktur, na których operuje move16 do granicy
- 16-tu bajtów, przyjrzyjmy siê wspólnie co siê tam w³a¶ciwie dzieje:
-
-
- TEST:
- MOVE.L BUFORF,D0
- ADD.L #$8,D0
- AND.L #$FFFFFFF8,D0
- MOVE.L D0,BUFORFM
-
- Domy¶laæ siê nale¿y, ¿e BUFORF to arbitralnie zaallokowany blok w pamiêci
- FAST. Powy¿sze instrukcje maj± wyznaczyæ pierwszy bajt przyalignowany do
- 8-miu. Robi± to, acz dosyæ nieudolnie, poniewa¿ jako parametr instrukcji
- ADD wystarczy³aby siódemka -- na okoliczno¶æ gdyby okaza³o siê, i¿ blok
- akurat rozpoczyna³ siê od granicy o¶miu bajtów. Jest to sprawa dosyæ
- elementarna, ale mo¿e autorowi przy¶wieca³y jakie¶ wy¿sze wzglêdy, trudne
- do ustalenia na podstawie tego kawa³ka ¼ród³a.
-
- W ka¿dym razie, adres przyalignowanego do 8-miu obszaru pamiêci zostaje
- odnotowany w zmiennej BUFORFM.
-
- MOVE.L BUFORC,D0
- ADD.L #$10,D0
- AND.L #$FFFFFFF0,D0
- MOVE.L D0,BUFORCM
-
- To samo co powy¿ej (zamiast $10 wystarczy³oby $0F), ale tym razem sprawa
- dotyczy bufora w pamiêci CHIP, a alignowanie odbywa siê do granicy 16-tu
- bajtów. W BUFORCM l±duje adres pierwszego bajtu tak przyalignowanego
- obszaru.
-
- MOVE.L #$AAAAAAAA,D0
- MOVE.L #$7F,D1
- MOVE.L BUFORFM,A0
- SKOK1: MOVE.L D0,(A0)+
- DBRA D1,SKOK1
-
- Pêtelka, która wype³nia pierwszych 512 bajtów bufora (mo¿na zak³adaæ, ¿e to
- jego ca³kowita wielko¶æ) w fa¶cie warto¶ci± $AA.
-
- MOVE.L #800,D4
-
- Instrukcja bez znaczenia dla dalszego przebiegu procedury. Wzmaga wra¿enie,
- ¿e "test" jest naprêdce wyciachanym fragmentem wiêkszej ca³o¶ci.
-
- SKOK5: MOVE.L BUFORFM,A1
- MOVE.L BUFORCM,A0
-
- Ustawiamy wska¼niki na pocz±tki przyalignowanych (odpowiednio do 8-miu i
- 16-tu) buforów.
-
- MOVEQ #14,D0
-
- Ilo¶æ obrotów pêtli -- 15.
-
- MOVE.L (A1)+,(A0)
- MOVE.L (A1)+,(A0)
-
- Dwa "puste" kopiowania. Zwiêkszaj± wska¼nik w fa¶cie o osiem, tym samym
- wyrównuj±c go do granicy 16-bajtów, prawda?
-
- Niezupe³nie.
-
- Ju¿ pierwotne wyrównanie do o¶miu mog³o spowodowaæ, ¿e adres zosta³
- wyrównany równie¿ do szesnastu: we¼my dowoln± liczbê i zaokr±glijmy j± w
- górê do wielokrotno¶ci ósemki -- w po³owie przypadków oka¿e siê, ¿e wynik
- jest równie¿ wielokrotno¶ci± szesnastki. Je¶li teraz dodamy osiem, oka¿e
- siê, ¿e dziêki tej operacji wywrównanie do szesnastu w³a¶nie stracili¶my. W
- po³owie przypadków.
-
-
- MOVE16 (A1)+,(A0)+
-
- Przerzucamy pierwsze szesna¶cie bajtów...
-
- SKOK2: MOVE16 (A1)+,(A0)+
- MOVE16 (A1)+,(A0)+
- DBRA D0,SKOK2
-
- ... i nastêpnych 2 * 16 * 15 = 480. Kopiowanie odbywa siê z FAST-u do
- CHIP-u, przy czym zwiêkszenie adresu ¼ród³owego (dwa pierwsze MOVE)
- powoduje, i¿ bufory s± przesuniête wzglêdem siebie o osiem bajtów...
-
- MOVE.L (A1)+,(A0)
- MOVE.L (A1)+,(A0)
-
- ...o których skopiowanie troszcz± siê te dwie instrukcje. Ogólnie A1
- inkrementowano tyle razy, ¿eby odczytaæ ca³y bufor (2 * 4 + 16 + 480 + 2 *
- 4 = 512 bajtów). Czê¶æ zapisów do CHIP-u posz³a natomiast do tych samych
- komórek, tak ¿e bufory s± teraz przesuniête wzglêdem siebie i nie ca³y
- bufor w CHIP-ie zosta³ zape³niony. Dlaczego akurat tak -- nie mam pojêcia,
- zak³adam ¿e w jaki¶ sposób pomaga to wyeksponowaæ problem.
-
-
- MOVE.L BUFORCM,A0
-
- Bierzemy adres pocz±tku bufora w CHIP-ie.
-
- MOVE.L #$7B,D1
-
- Znowu zbêdna instrukcja....
-
- MOVE.L #$AAAAAAAA,D0
- SKOK3: CMP.L (A0)+,D0
-
- Porównujemy pierwsze d³ugie s³owo z bufora z tym, co powinno siê w nim
- znajdowaæ.
-
- BNE.B ERROR
-
- Nie zgadza siê? Pech...
-
- MOVEQ #1,D0
- RTS
-
- Ufff.
-
- ERROR:
- MOVEQ #0,D0
- RTS
-
- Kasa = Kasa - 330zl.
-
-
-
- Moje pytanie do pana Darka: jak to w koñcu jest z tym przyalignowaniem do
- 16-tu, hê? Nie mam ani FAST-ATA, ani PPC, ani nawet "test" nie robi u mnie
- krzaków, ale chêtnie bym siê dowiedzia³, czy oryginalny ata.device (czy jak
- mu tam), alignuje równie mistrzowsko jak procedura testowa.
-
- Hej,
- Mi³ek
- --
- mailto:thorgal@amiga.com.pl | "Man in the Moon and other weird things" -
- http://wfmh.org.pl/~thorgal/ | see it at http://wfmh.org.pl/~thorgal/Moon/
-
-
-